package tempest.interfaces.menuiteminterface;

import tempest.clients.PlayerClient;
import tempest.data.Data;
import tempest.interfaces.MudInterface;
import tempest.primitives.MudString;

public class MenuItemInterface extends MudInterface

{
  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  private boolean nullCommand;
  private boolean commandEntered;
  private Data menuItem;
  private Data target;

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public MenuItemInterface(PlayerClient client, Data menuItem, Data target)

  {
    super(client);
    this.menuItem = menuItem;
    this.target = target;
  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public void handleInput()

  {
    if (commandQueue.size() == 0) return;
    commandEntered = true;
    String command = commandQueue.removeFirst();

    if (command.length() != 0)

    {
      MudString temp = new MudString(command);
      target.setValue(temp);
      client.popInterface();
    }

    else nullCommand = true;
  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public void handleOutput()

  {
    if (client.isLinkdead()) return;

    if (nullCommand)

    {
      client.msg(getPrompt());
      nullCommand = false;
      return;
    }

    if (outputQueue.size() == 0) return;

    MudString output = new MudString();

    if (!commandEntered) output.append("\r\n");

    commandEntered = false;

    for (int i=0; i<outputQueue.size(); i++)

    {
      output.append("\r\n");
      output.append(outputQueue.get(i));
    }

    output.append("\r\n\r\n");
    output.append(getPrompt());
    client.msg(output);
    outputQueue.clear();
  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public void receiveCommand(String commandString) throws Exception

  {
    commandString = commandString.trim();

    if (commandString.length() > 0)
      commandQueue.add(commandString);
    else nullCommand = true;
  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public void echo(String s)

  {
    outputQueue.add(s);
  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public void echo(MudString s)

  {
    outputQueue.add(s.toString());
  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public void onPush()

  {
    if (menuItem.get("Type").value().equals("Composer"))

    {
      // Push composer interface.
    }

    if (menuItem.get("Type").value().equals("Menu"))

    {
      // Push menu interface.
    }
  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public void onPop()

  {

  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public void onDisconnect()

  {

  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public void onReconnect()

  {

  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public MudString getPrompt()

  {
    MudString prompt = new MudString();
    prompt.append(menuItem.get("Prompt").value());
    prompt.append(": ");
    return prompt;
  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public void focusGained()

  {
    nullCommand = true;
  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public void exit()

  {

  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////
}